/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.namabank.helpdesk.model;

import com.namabank.db.GlobalHibernate;
import com.namabank.helpdesk.dbobj.*;
import java.util.*;
import org.apache.commons.lang.StringEscapeUtils;
/**
 *
 * @author Nguyen Tran Hien
 */
public class UserModel {
    public UserModel(SMTB_USER ins){
        if(ins == null || ins.getUSER_ID() == null)
            throw new NullPointerException("Param ins is null or field USER_ID is null");
        smtbUserObj = ins;
    }

    private SMTB_USER smtbUserObj = null;
    private HashMap<String, List<String>> hashActiveRoleId = null;
    private List<SMTB_USER_DEPT> listActiveUserDeptObj = null;
    private List<String> listActiveRoleId = null;

    // <editor-fold defaultstate="collapsed" desc="Những hàm private">
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Những hàm public">
    /**
     * Khởi tạo lại biến listActiveUserDeptObj (đọc lại danh sách đơn vị của user từ database)
     * @return trả về số đơn vị mà user thuộc về
     */
    public int initListActiveUserDeptObj(){
        listActiveUserDeptObj = null;
        if(smtbUserObj != null && smtbUserObj.getUSER_ID() != null && smtbUserObj.getUSER_ID().length() > 0){
            String qry = "from SMTB_USER_DEPT where USER_ID = '" + smtbUserObj.getUSER_ID() + "' and RECORD_STAT = 'O'";
            listActiveUserDeptObj = GlobalHibernate.openSession().createQuery(qry).list();
        }
        if(listActiveUserDeptObj == null){
            listActiveUserDeptObj = new ArrayList<SMTB_USER_DEPT>();
        }
        return listActiveUserDeptObj.size();
    }

    /**
     * Khởi tạo lại biến listActiveRoleId (đọc lại role của user từ database)
     * @return trả về số role mà user có
     */
    public int initListActiveRoleId(){
        if(hashActiveRoleId != null)
            hashActiveRoleId.clear();
        else
            hashActiveRoleId = new HashMap<String, List<String>>();
        if(listActiveRoleId != null)
            listActiveRoleId.clear();
        else listActiveRoleId = new ArrayList<String>();
        if(smtbUserObj != null && smtbUserObj.getUSER_ID() != null && smtbUserObj.getUSER_ID().length() > 0){
            String qry = "select DEPT_ID, ROLE_ID from SMTB_USER_ROLE where USER_ID = '" + smtbUserObj.getUSER_ID() + "'" + " and RECORD_STAT = 'O' order by DEPT_ID";
            List<Object[]> lst = GlobalHibernate.openSession().createQuery(qry).list();
            for(int i = 0; i < lst.size(); i++){
                String deptId = (String)lst.get(i)[0];
                String roleId = (String)lst.get(i)[1];
                if(!hashActiveRoleId.containsKey(deptId)){
                    hashActiveRoleId.put(deptId, new ArrayList<String>());
                }
                hashActiveRoleId.get(deptId).add(roleId);
                if(!listActiveRoleId.contains(roleId)){
                    listActiveRoleId.add(roleId);
                }
            }
        }
        return listActiveRoleId.size();
    }

    /**
     * Kiểm tra user có roleId trong deptId không
     * @param roleId
     * @param deptId
     * @return
     */
    public boolean hasRole_in_Dept(String roleId, String deptId){
        if(hashActiveRoleId == null){
            initListActiveRoleId();
        }
        if(!hashActiveRoleId.containsKey(deptId))
            return false;
        List<String> lstRole = hashActiveRoleId.get(deptId);
        return lstRole != null && lstRole.contains(roleId);
    }
    /**
     * @return the smtbUserObj
     */
    public SMTB_USER getSmtbUserObj() {
        return smtbUserObj;
    }

    /**
     * @return the listActiveUserDeptObj
     */
    public List<SMTB_USER_DEPT> getListActiveUserDeptObj() {
        if(listActiveUserDeptObj == null)
            initListActiveUserDeptObj();
        return listActiveUserDeptObj;
    }

    /**
     * Trả về danh sách những quyền mà user có (không tính phòng ban)
     * @return the listActiveRoleId
     */
    public List<String> getListActiveRoleId() {
        if(listActiveRoleId == null)
            initListActiveRoleId();
        return listActiveRoleId;
    }

    public boolean hasRole(String roleId){
         if(listActiveRoleId == null)
            initListActiveRoleId();
       return listActiveRoleId.contains(roleId);
    }

    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Những hàm static">
    /**
     * Khoi tao mot UserModel dua vao user_id
     * @param userId
     * @return
     */
    public static UserModel getInstance(String userId){
        String qry = "FROM SMTB_USER WHERE USER_ID = '" + StringEscapeUtils.escapeSql(userId) + "'";
        SMTB_USER smtbUser = (SMTB_USER)GlobalHibernate.openSession().createQuery(qry).uniqueResult();
        if(smtbUser == null)
            return null;
        UserModel res = new UserModel(smtbUser);
        return res;
    }
    // </editor-fold>


}
